﻿//using System.IO;
//using System.Windows.Controls;
//using GameEditor;
//using GameEditor.View;
//using GameEditor.View.Components;
//using GameEngine.Model;
//using GameEngine.Model.Data;
//using PureMVC.Interfaces;
//using PureMVC.Patterns;
//using SilverlightClientEditor;
//using SilverlightClientEditor.View.Components;
//using GameEngine.Model.Data.implementation;
//using SilverlightClientEditor.View;
//using GameEngine.Clients.Silverlight.View.Components;
//using GameEngine.Clients.Silverlight;
//using GameEngine;
//using System;
//using GameEngine.View.Components;
//using System.Windows;

//namespace SilverlightShowCase.Commands
//{
//    /// <summary>
//    /// Creates all the necessary thing to present the GameEditor
//    /// </summary>
//    public class EditorStartup_Command<MyGameView,MyLevelView> : SimpleCommand
//        where MyGameView : class, IGameView<int, MyLevelView, WorldUC, MapUC, ItemUC, FrameworkElement>
//        where MyLevelView : class, ILevelView<int, WorldUC, MapUC, ItemUC, FrameworkElement>       
//    {
//        override public void Execute(INotification notification)
//        {
//            if (notification.Body == null)
//                throw new Exception(this.GetType().Name + " has to have body");

//            var gameVO = notification.Body as IGameVO<int>;
//            var dataProxy = ApplicationFacadeHelper<int>.CreateGame(gameVO);
//            //var dataProxy = notification.Body as IGameDataProxy<int>;
            
//            var gameMenuMediator = SilverlightEditorViewFacade<MyGameView,MyLevelView>.Helper.CreateGamePropertiesEditor(dataProxy);
//            var levelDataProxy = ApplicationFacadeHelper<int>.CreateLevel(dataProxy.VO.Levels[gameMenuMediator.SelectedLevel]);
//            var levelMenuMediator = SilverlightEditorViewFacade<MyGameView, MyLevelView>.Helper.CreateLevelPropertiesEditor(levelDataProxy);
            
//            //var resourcesMediator = SilverlightEditorViewFacade<GameUC, LevelUC>.Helper.CreateResourceEditorMenu(
//            //    SilverlightEditorFacade<GameUC, LevelUC>.MY_PAGE_RESOURCEEDITORMENU_ACTION_COMMAND);
//            //var viewMediator = SilverlightEditorViewFacade<GameUC, LevelUC>.Helper.CreateViewEditorMenu(
//            //    SilverlightEditorFacade<GameUC, LevelUC>.MY_PAGE_VIEWEDITORMENU_ACTION_COMMAND);
//            //var thingTypeMediator = SilverlightEditorViewFacade<GameUC, LevelUC>.Helper.CreateThingTypeEditorMenu(
//            //    SilverlightEditorFacade<GameUC, LevelUC>.MY_PAGE_THINGTYPEEDITORMENU_ACTION_COMMAND);
//            var worlds = levelDataProxy.Worlds.GetEnumerator();
//            worlds.MoveNext();
//            var worldDataProxy = worlds.Current.Value;
//            var worldMenuMediator = SilverlightEditorViewFacade<MyGameView, MyLevelView>.Helper.CreateWorldPropertiesEditor(
//                worldDataProxy);
//            var thingMediator = SilverlightEditorViewFacade<MyGameView, MyLevelView>.Helper.CreateThingEditorMenu(null);
//            var mapMediator = SilverlightEditorViewFacade<MyGameView, MyLevelView>.Helper.CreateMapPropertiesEditor(worldDataProxy.Map);

//            var mediator = SilverlightEditorViewFacade<MyGameView, MyLevelView>.Helper.CreateGameEditor(
//                dataProxy,
//                SilverlightViewFacade<MyGameView,MyLevelView>.Helper.GetWorldMediator(levelMenuMediator.SelectedWorld),
//                gameMenuMediator,
//                levelMenuMediator,
//                worldMenuMediator,
//                mapMediator,
//                //resourcesMediator,
//                //viewMediator,
//                //thingTypeMediator,
//                thingMediator,
//                notification.Type
//                );
//        }
//    }

//    public class EditorFinish_Command : SimpleCommand
//    {
//        override public void Execute(INotification notification)
//        {
//            var mediator = Facade.RetrieveMediator(GameEditorFacade.GameEditorMediatorName) as SilverlightGameEditorMediator;
//            Facade.RemoveMediator(mediator.thingEditorMenuMediator.MediatorName);
//            Facade.RemoveMediator(mediator.mapEditorMenuMediator.MediatorName);
//            Facade.RemoveMediator(mediator.worldEditorMenuMediator.MediatorName);
//            Facade.RemoveMediator(mediator.levelEditorMenuMediator.MediatorName);
//            Facade.RemoveMediator(mediator.gameEditorMenuMediator.MediatorName);
//            Facade.RemoveMediator(mediator.worldMediator.MediatorName);
//            Facade.RemoveMediator(mediator.MediatorName);
//            ApplicationFacadeHelper<int>.DestroyGame();
//            SendNotification(mediator.exitCommand, mediator.game.VO);
            
//            //        bool exit = false;
//    //        var gameDataProxy = MyModelFacade.Instance.Game;
//    //        var mediator = Facade.RetrieveMediator(GameEditorFacade.GameEditorMediatorName) as SilverlightGameEditorMenuMediator<GameUC, LevelUC>;
//    //        switch ((IGameEditorMenuViewConstants.ButtonTags)notification.Body)
//    //        {
//    //            case IGameEditorMenuViewConstants.ButtonTags.EXIT:
//    //                //do you want to save?
//    //                SendNotification(MyFacade.MY_PAGE_GAMESEDITOR_IN_COMMAND);
//    //                exit = true;
//    //                break;
//    //            #region Save
//    //            case IGameEditorMenuViewConstants.ButtonTags.SAVE:
//    //                {
//    //                    SaveFileDialog sd = new SaveFileDialog();
//    //                    if (sd.ShowDialog().Value)
//    //                    {
//    //                        gameDataProxy.Name = mediator.Name;
//    //                        gameDataProxy.TileSize = mediator.TileSize;
//    //                        gameDataProxy.MaxHeight = mediator.MaxMapHeight;
//    //                        gameDataProxy.MinHeight = mediator.MinMapHeight;
//    //                        gameDataProxy.TileHeightUnit = mediator.TileHeightUnit;
//    //                        gameDataProxy.Levels.Clear();
//    //                        foreach (var obj in mediator.GetLevels()) {
//    //                            gameDataProxy.Levels.Add(obj, MyModelFacade.Helper.GetLevelDataProxy(obj).VO);
//    //                        }
//    //                        gameDataProxy.Views.Clear();
//    //                        foreach (var obj in mediator.GetViews())
//    //                        {
//    //                            gameDataProxy.Views.Add(obj, MyModelFacade.Helper.GetViewDataProxy(obj).VO);
//    //                        }
//    //                        gameDataProxy.ThingTypes.Clear();
//    //                        foreach (var obj in mediator.GetThingTypes())
//    //                        {
//    //                            gameDataProxy.ThingTypes.Add(obj, MyModelFacade.Helper.GetThingTypeDataProxy(obj).VO);
//    //                        }
//    //                        gameDataProxy.Resources.Clear();
//    //                        foreach (var obj in mediator.GetResources())
//    //                        {
//    //                            gameDataProxy.Resources.Add(obj, MyModelFacade.Helper.GetResourceDataProxy(obj).VO);
//    //                        }

//    //                        string output = gameDataProxy.VO.Serialize();
//    //                        TextWriter w = new StreamWriter(sd.OpenFile());
//    //                        w.Write(output); 
//    //                        w.Flush(); 
//    //                        w.Close();
//    //                    }
//    //               }
//    //                break;
//    //            #endregion
//    //            #region Level
//    //            case IGameEditorMenuViewConstants.ButtonTags.NEWLEVEL:
//    //                {
//    //                    var vo = new LevelVO<int>(new LevelVOId<int>(MyModelFacade.Instance.CreateNewId()));
//    //                    MyFacadeHelper.CreateLevel(vo);
//    //                    var dataProxy = MyModelFacade.Helper.GetLevelDataProxy(vo);
//    //                    mediator.AddLevel(vo.Id);
//    //                    SendNotification(MyFacade.MY_PAGE_LEVELEDITOR_IN_COMMAND, dataProxy);
//    //                }
//    //                exit = true;
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.EDITLEVEL:
//    //                {
//    //                    var dataProxy = MyModelFacade.Helper.GetLevelDataProxy(mediator.SelectedLevel);
//    //                    SendNotification(MyFacade.MY_PAGE_LEVELEDITOR_IN_COMMAND, dataProxy);
//    //                }
//    //                exit = true;
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.REMOVELEVEL:
//    //                {
//    //                    var id = mediator.SelectedLevel;
//    //                    var dataProxy = MyModelFacade.Helper.GetLevelDataProxy(id);
//    //                    MyFacadeHelper.DestroyLevel(dataProxy.VO);
//    //                    mediator.RemoveLevel(id);
//    //                }
//    //                break;
//    //            #endregion
//    //            #region ThingType
//    //            case IGameEditorMenuViewConstants.ButtonTags.NEWTHINGTYPE:
//    //                {
//    //                    var vo = new ThingTypeVO<int>(new ThingTypeVOId<int>(MyModelFacade.Instance.CreateNewId()));
//    //                    MyFacadeHelper.CreateThingType(vo);
//    //                    var dataProxy = MyModelFacade.Helper.GetThingTypeDataProxy(vo);
//    //                    mediator.AddThingType(vo.Id);
//    //                    SendNotification(MyFacade.MY_PAGE_THINGTYPEEDITOR_IN_COMMAND, dataProxy);
//    //                }
//    //                exit = true;
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.EDITTHINGTYPE:
//    //                {
//    //                    var dataProxy = MyModelFacade.Helper.GetThingTypeDataProxy(mediator.SelectedThingType);
//    //                    SendNotification(MyFacade.MY_PAGE_THINGTYPEEDITOR_IN_COMMAND, dataProxy);
//    //                }
//    //                exit = true;
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.REMOVETHINGTYPE:
//    //                {
//    //                    var id = mediator.SelectedThingType;
//    //                    var dataProxy = MyModelFacade.Helper.GetThingTypeDataProxy(id);
//    //                    MyFacadeHelper.DestroyThingType(dataProxy.VO);
//    //                    mediator.RemoveThingType(id);
//    //                }
//    //                break;
//    //            #endregion
//    //            #region View
//    //            case IGameEditorMenuViewConstants.ButtonTags.NEWVIEW:
//    //                {
//    //                    var vo = new ViewVO<int>(new ViewVOId<int>(MyModelFacade.Instance.CreateNewId()));
//    //                    MyFacadeHelper.CreateView(vo);
//    //                    var dataProxy = MyModelFacade.Helper.GetViewDataProxy(vo);
//    //                    mediator.AddView(vo.Id);
//    //                    SendNotification(MyFacade.MY_PAGE_VIEWEDITOR_IN_COMMAND, dataProxy);
//    //                }
//    //                exit = true;
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.EDITVIEW:
//    //                {
//    //                    var dataProxy = MyModelFacade.Helper.GetViewDataProxy(mediator.SelectedView);
//    //                    SendNotification(MyFacade.MY_PAGE_VIEWEDITOR_IN_COMMAND, dataProxy);
//    //                }
//    //                exit = true;
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.REMOVEVIEW:
//    //                {
//    //                    var id = mediator.SelectedView;
//    //                    var dataProxy = MyModelFacade.Helper.GetViewDataProxy(id);
//    //                    MyFacadeHelper.DestroyView(dataProxy.VO);
//    //                    mediator.RemoveView(id);
//    //                }
//    //                break;
//    //            #endregion
//    //            #region ViewState
//    //            case IGameEditorMenuViewConstants.ButtonTags.NEWVIEWSTATE:
//    //                {
//    //                    var id = mediator.SelectedViewState;
//    //                    mediator.AddViewState(id);
//    //                }
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.EDITVIEWSTATE:
//    //                {
//    //                    var dataProxy = MyModelFacade.Helper.GetViewDataProxy(mediator.SelectedView);
//    //                    SendNotification(MyFacade.MY_PAGE_VIEWEDITOR_IN_COMMAND, dataProxy);
//    //                }
//    //                exit = true;
//    //                break;
//    //            case IGameEditorMenuViewConstants.ButtonTags.REMOVEVIEWSTATE:
//    //                {
//    //                    var id = mediator.SelectedView;
//    //                    var dataProxy = MyModelFacade.Helper.GetViewDataProxy(id);
//    //                    MyFacadeHelper.DestroyView(dataProxy.VO);
//    //                    mediator.RemoveView(id);
//    //                }
//    //                break;
//    //            #endregion
//    //            //case IGameEditorMenuViewConstants.ButtonTags.NEWRESOURCEBUTTON:
//    //            //    {
//    //            //        var vo = new ResourceVO(new ResourceVOId("New Resource " + MyModelFacade.Instance.CreateNewId()));
//    //            //        MyFacadeHelper.CreateResource(vo);
//    //            //        var dataProxy = MyModelFacade.Helper.GetLevelDataProxy(vo);
//    //            //        SendNotification(MyFacade.MY_PAGE_LEVELEDITOR_IN_COMMAND, dataProxy);
//    //            //    }
//    //            //    break;
//    //            //case IGameEditorMenuViewConstants.ButtonTags.EDITRESOURCEBUTTON:
//    //            //    {
//    //            //        var dataProxy = MyModelFacade.Helper.GetResourceDataProxy(mediator.SelectedResource);
//    //            //        SendNotification(MyFacade.MY_PAGE_RESOURCEEDITOR_IN_COMMAND, dataProxy);
//    //            //    }
//    //            //    break;
//    //        }
//    //        if(exit)
//    //            Facade.RemoveMediator(GameEditorFacade.GameEditorMediatorName);
//        }
//    }
//}

